<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>5.原型链 </title>
</head>

<body>
    <!-- 1. 原型链
        * 访问一个对象的属性时，
            * 先在自身属性中查找，找到返回
            * 如果没有，再沿着[__proto__]这条链向上查找，找到返回
            * 如果最终没有找到，返回undefined
        别名: 隐式原型链
        作用: 查找对象的属性（方法） -->
    <script>
        function Fn() { // ① 在堆中产生一个Fn函数对象，然后将这个Fn函数对象赋值给栈中的Fn变量.
            this.test1 = function() {
                console.log('test1()');
            }
        }
        console.log(Object.prototype);
        console.log(Fn.prototype); // ② 指向一个Object空对象
        // 给Fn 添加test2 方法
        Fn.prototype.test2 = function() {
            console.log('test2()');
        }
        var fn = new Fn();
        fn.test1();
        fn.test2();
        console.log(fn.toString());
        console.log(fn.test3) //undefined  ,如果加（）则会报 is not a function
        var a = new Object();
        var b = {}
        console.log(a);
        console.log(b);

        // 1. 函数的显式原型指向的对象默认是空Object实例对象（但Object不满足）
        console.log(Fn.prototype instanceof Object); // true
        console.log(Object.prototype instanceof Object); // false
        console.log(Function.prototype instanceof Object); // true
        // 2. 所有函数都是Function的实例（包含Function）
        console.log(Function.__proto__ === Function.prototype); // true
        // Object的原型对象是原型链尽头
        console.log(Object.prototype.__proto__); // null
    </script>
</body>

</html>